package mymyoux.core
{


	import flash.net.SharedObject;
	
	import mymyoux.events.HashEvent;
	import mymyoux.utils.Hash;
	 /**
	 * <code><b>[Depreciated]</b></code> Var permet de stocker des variables dans une structure de type <code>Hash</code> afin de pouvoir aisément les utiliser.
	 * Elle intègre également une gestion du cache à travers un élement <code>SharedObject</code>.
	 * @author Mymyoux
	 * @version 2.0
	 */
	 //TODO:dispatché event var dans Lang
	public class Var extends Hash
	{
		/**
		 * Contient l'ensemble des variables présentes dans le cache.
		 */
		protected var cache:Array;
		/**
		 * Utilisée pour sauvegarder les variables choisies dans le cache.
		 */
		protected var so:SharedObject;
		/**
		 * @private
		 */ 
		protected var _cachePath:String;
		/**
		 * @private
		 */ 
		protected var _cacheName:String;
		/**
		 * @private
		 */ 
		protected var _cacheSecured:Boolean;
		/**
		 * Créer un objet de type Var.
		 * @param weakKeys Crée un lien fort ou pas.
		 * @param cacheName Nom du cache.
		 * @param cachePath Chemin du cache.
		 * @param cacheSecured Indique si le cache ne doit autoriser que les connextions HTTPS.
		 */
		public function Var(weakKeys:Boolean=false,cacheName:String="local",cachePath:String=null,cacheSecured:Boolean=false)
		{
			super(weakKeys);
			cache=new Array();
			_cacheName=cacheName;
			_cachePath=cachePath;
			_cacheSecured=cacheSecured;
			load();
			addEventListener(HashEvent.UPDATE,onUpdate);
			addEventListener(HashEvent.REMOVE,onRemove);
		}
		/**
		 *  Nom du cache.
		 *  @default local
		 */
		public function get cacheName():String
		{
			return _cacheName;	
		}
		/**
		 *  Chemin du cache.
		 * 	@default null
		 */
		public function get cachePath():String
		{
			return _cachePath;
		}
		/**
		 * Indique si le cache ne doit autoriser que les connextions HTTPS.
		 * @default false
		 */
		public function get cacheSecured():Boolean
		{
			return _cacheSecured;
		}
		/**
		 * Permet la modification du cache. Entraine une reconstruction complète du Hash avec dispatch d'évènements.
		 * @param cacheName Nom du cache.
		 * @param cachePath Chemin du cache.
		 * @param cacheSecured Indique si le cache ne doit autoriser que les connextions HTTPS.
		 */
		public function changeCache(cacheName:String="local",cachePath:String=null,cacheSecured:Boolean=false):void
		{
			if(_cacheName!=cacheName || _cachePath!=cachePath || cacheSecured!=_cacheSecured)
			{
				_cacheName=cacheName;
				_cachePath=cachePath;
				_cacheSecured=cacheSecured;
				load();
			}
		}
		/**
		 * Ajoute une variable dans le cache. Et le cas échéant appel <code>save()</code>
		 * @param name Nom de la variable.
		 * @see #save()
		 */
		public function putToCache(name:String):void
		{
			if(!isCached(name))
			{
				cache.push(name);
				save(name);
			}
		}
		/**
		 * Indique si la variable est sauvegardée ou non dans le cache.
		 * @param name Nom de la variable.
		 * @return <code>true</code> si la variable est dans le cache.
		 */
		public function isCached(name:String):Boolean
		{
			return cache.indexOf(name)>=0;
		}
		/**
		 * Exécutée lorsqu'une variable est modifiée dans le Hash. Elle permet l'appel à <code>save()</code> si celle-ci est dans le cache.
		 * @param event HashEvent contenant la clé,l'ancienne valeur et la nouvelle valeur de la variable
		 * @see #save()
		 */
		protected function onUpdate(event:HashEvent):void
		{
			if(isCached(event.key.toString()))
			{
				save(event.key.toString());
			}
		}
		/**
		 * Exécutée lorsqu'une variable est retirée du Hash. Elle permet l'appel à <code>save()</code> si celle-ci est dans le cache.
		 * @param event HashEvent contenant la clé et l'ancienne valeur de la variable.
		 * @see #save()
		 */
		protected function onRemove(event:HashEvent):void
		{
			if(isCached(event.key.toString()))
			{
				save(event.key.toString());
			}
		}
		public override function load(data:Object):void
		{so=SharedObject.getLocal(_cacheName,_cachePath,_cacheSecured);
		//	var a:Array=cache.concat();
			for(var p:String in so.data)
			{
				put(p,so.data[p]);
			}
		}
		/**
		 * Sauvegarde la variable dans le cache.
		 * @param name Nom de la variable à sauvegarder.
		 */
		protected function save(name:String):void
		{
			so.data["name"]=get(name);
			try
			{
				so.flush();
			}catch(error:Error)
			{
				trace("Impossible d'écrire dans le cache : "+error);
			}
		}
	}
}